#ifndef SUBWIDGET_SERIAL_H
#define SUBWIDGET_SERIAL_H

#include <QWidget>
#include <QThread>

class QSerialPort;

namespace Ui {
class SubWidget_Serial;
}

class SubWidget_Serial : public QWidget
{
    Q_OBJECT    
public:
    explicit SubWidget_Serial(QWidget *parent = nullptr);

    //新建一个构造函数让外部可以初始化串口信息

    //弄一个txt配置文件，保存配置信息(如使用的串口号、波特率、每个设备号对应设备的功能)，每次添加设备，都向文件添加新的设备，首次需要进行串口配置和设备配置

    //自动读取文件配置，并获取详细信息

    bool is_SerialPort_ready() const;
    double receive_message();
    void send_message(QByteArray d);
    const QSerialPort& get_mySerialPort() const;  //感觉不能将私有属性开放出去,等着问问老师
    ~SubWidget_Serial();

private slots:
    void slot_send_message(QByteArray d, QString mess="");

    void on_comboBox_serialPort_currentTextChanged(const QString &arg1);

    void on_comboBox_Baud_rate_currentIndexChanged(int index);

    void on_radioButton_close_clicked();                        //m_is_serialport_ready这个私有属性，仅允许在这个函数里被改变
signals:
    //index存储的是当前指向哪个容器
    void get_data(int index, double data);
    void push_to_sql(double index, double data=0);
private:
    void Serial_init();

    class DataFrame;
    double deal(DataFrame datafrm);         //仅处理水分
    double dealMulty(DataFrame datafrm);    //处理多种传感器数据
private:
    class DataFrame
    {
    public:
        DataFrame();
        //追加数据
        void append(char v);
        //返回数据尺寸
        std::size_t size() const;
        //重载操作符
        char& operator [](std::size_t index);
        const char& operator [](std::size_t index) const;
        //清空帧
        void clear();
        //打印帧
        void print();
    private:
        std::vector<char> datas;
    };

private:
    Ui::SubWidget_Serial *ui;
    QSerialPort *m_SerialPort;
    DataFrame m_datafrm;
    bool m_is_serialport_ready;    //是否串口已经初始化成功，仅允许在void on_radioButton_close_clicked();函数中更改，这个变量也不能开放到外面去
};

#endif // SUBWIDGET_SERIAL_H
